<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="../../vue.js"></script>
    <title>Document</title>
</head>

<body>
    <!-- 
        Vue中使用组件的三大步骤
            一、定义组件 即创建组件
            二、注册组件
            三、使用组件（写组件标签即可）
        
        一、如何定义一个组件
        使用Vue.extend(option)创建.其中options 和 new Vue(option) 时传入的那个option几乎一样,但也有区别:
        区别如下:
            1.el不要写,为什么? --最终所有的组件都要经过一个vm的管理,由vm决定服务于那个容器
            2.data必须写函数式,为什么? -- 避免组件被复用时,数据存在引用关系
        备注:使用template可以配置组件结构

        二. 如何注册组件
            1.局部注册: 靠 new Vue的时候传入components选项
            2.全局注册: 靠 Vue.component('组件名称',组件)

        三. 编写组件标签
            <h-h></h-h>
     -->
    <div id="root">
        <x-x></x-x>
        <hr>
        <n-n></n-n>
        <h-h></h-h>
    </div>
    <hr>
    <div id="app">
        <h-h></h-h>
    </div>
</body>
<script>
    // 创建姓名年龄组件
    const student = Vue.extend({
        template: `
        <div>
            <h2>姓名：{{name}}</h2>
            <h2>年龄：{{age}}</h2>
        </div>
        `,
        data() {
            return {
                name: '张三',
                age: 18
            }
        }
    })
    // 创建性别爱好组件
    const msg = Vue.extend({
        template: `
        <div>
           <h2>性别：{{sex}}</h2>
           <h2>爱好：{{hobby}}</h2>
        </div>
        `,
        data() {
            return {
                sex: '女',
                hobby: '吃饭'
            }
        }
    })
    // 创建hello组件
    const hello = Vue.extend({
        template:`
            <div>
                <h2>你好!{{name}}</h2>
            </div>
        `,
        data(){
            return {
                name:'张三'
            }
        }
    })
    
    // 全局注册组件
    Vue.component('h-h',hello)
    
    new Vue({
        el: '#root',
        // 注册组件 (局部注册)
        components: {
            'x-x': student,
            'n-n': msg
        }
    })

    new Vue({

    }).$mount('#app')
</script>

</html>